package com.mybatis.mapper;

import com.mybatis.pojo.User;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * Copyright (c) 2023-2033 All Rights Reserved
 *
 * MyBatis执行查询操作，不同类型结果的保存
 * MyBatis对常用容器做了别名处理，XML映射文件中的结果类型 resultMap 可以使用 Integer、Map等
 *
 * TODO：
 *  1. 查询结果只有一条，可以直接映射保存到实体类对象```resultType="User"``` 也可以保存到Map ```resultType="Map"```。
 *  2. 查询结果为数据类型，MyBatis内部定义了默认的别名```resultType="java.lang.Integer"、"int"、“Integer"```。
 *  3. 查询结果有多条，可以保存到 List<User>，```resultType="com.mybatis.pojo.User"```
 *  4. 查询结果有多条，可以保存到 List<Map>，一条数据对应一个map，```resultType="Map"```
 *  5. 查询结果有多条，可以保存到 Map，一条数据对应一个map，在Mapper接口方法上添加注解 @MapKey("id") ，查询结果以id-map形式保存
 *
 * @date: 2023/10/16
 */
public interface SelectMapper {

    /**
     * 查询结果只有一条，直接映射保存到实体类对象
     * @param id
     * @return
     */
    User selectUserById(@Param("id") Integer id);

    /**
     * 查询结果只有一条，
     * @param username
     * @return
     */
    Map<String, Object> selectUserToMap(@Param("username") String username);

    /**
     * 查询个数，MyBatis内部定义了默认的别名
     * @return
     */
    Integer selectUserCount();

    /**
     * 查询结果有多条，保存到 List
     * resultType = "User"
     *
     * @return
     */
    List<User> selectUserAll();

    /**
     * 查询结果保存到List<Map>
     */
    List<Map<String, Object>> selectUserAllToListMap();

    /**
     * 查询结果保存到Map
     */
    @MapKey("id")
    Map<String, Object> selectUserAllToMap();
}
